package com.pactera.madp.cp.service;

import com.pactera.madp.cp.api.model.WechatResponse;
import com.pactera.madp.cp.api.model.authorization.GetPreAuthCodeResponse;
import com.pactera.madp.cp.api.model.authorization.OfficialAccountPreCodeResponse;
import com.pactera.madp.cp.api.vo.wechat.WechatAuthorizerListVO;

import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * @author: chenhao
 * @date: 2021/7/15 16:59
 * @description: 第三方平台接口
 */
public interface WechatComponentService {

        String AUTHORIZED_URL_TYPE_PC = "0";
        /**
         * 启动ticket推送服务
         *
         * @return 错误码:0,ok是指从不正常变成正常 in a normal state是指本来就正常。
         * 其他错误码:https://developers.weixin.qq.com/doc/oplatform/Return_codes/Return_code_descriptions_new.html
         */
        WechatResponse startPushTicket();
        /**
         * 微信消息报文解密
         * @param msgSignature 消息体签名
         * @param timestamp  时间戳
         * @param msg 解密前消息
         * @param nonce  随机数
         * @return 解密后消息
         */
        String decryptWechatMessage(String msgSignature, String timestamp, String nonce,String msg);

        /**
         * 缓存验证票据（component_verify_ticket）
         * 微信服务器会向三方平台 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket。
         * 在WechatComponentController /wechat/component/callback中接受票据，然后调用该方法缓存起来。
         * @param componentVerifyTicket 验证票据
         */
        void setComponentVerifyTicket(String componentVerifyTicket);

        /**
         *从缓存中获取验证票据
         * @return 验证票据
         */
        String getComponentVerifyTicket();

        /**
         * 获取三方平台的令牌，并缓存到Redis。
         * 令牌（component_access_token）是第三方平台接口的调用凭据。
         * @return ComponentAccessTokenResponse，令牌和有效期。
         */
        String componentAccessToken();

        /**
         * 从缓存中获取令牌（component_access_token）。
         * 如果缓存未命中，则会再次调用 componentAccessToken() 方法获取。
         * @return String 令牌
         */
        String getComponentAccessToken();

        /**
         * 获取三方平台授权托管的预授权码。
         * 预授权码（pre_auth_code）是第三方平台方实现授权托管的必备信息，每个预授权码有效期为 1800秒。
         * 预授权码用于构造授权链接，小程序/公众号管理员通过授权链接将应用托管给三方平台。
         * @return GetPreAuthCodeResponse 授权码与有效期。
         */
        GetPreAuthCodeResponse preAuthCode();

        /**
         * 从缓存中获取预授权码（pre_auth_code）。
         * 如果缓存未命中，则会再次调用 preAuthCode() 方法获取。
         * @return 预授权码（pre_auth_code）
         */
        String getPreAuthCode();

        /**
         * 公众号网页授权
         *
         * @return
         */
        String getUserAuthorization() throws UnsupportedEncodingException;

        /**
         * 获取accessToken
         *
         * @param code 授权码
         * @param appId 公众号id
         * @return
         */
        OfficialAccountPreCodeResponse getUserAuthorizationAccessToken(String appId, String code);

        /**
         * 从缓存中获取公众号的授权码
         *
         * @param appId
         * @return
         */
        String getAccessToken(String appId);
        /**
         * 获取/刷新接口调用令牌
         *
         * @param appId 授权方appId
         * @param refreshToken 刷新令牌
         * @return
         */
        String  getAccessTokenByRefreshToken(String appId,String refreshToken);

        /**
         * 获取、同步公众号素材列表/无-新增，有-修改
         *
         * @param type 素材类型（目前默认为文章）
         * @param offset 开始值
         * @param classification 分类
         * @param count  素材范围
         * @param appId 公众号id
         * @return WechatMarketingVO
         */
        void getMarketingList(String appId, Integer classification, String type, Integer offset, Integer count);

        /**
         *拉取所有已授权的帐号信息
         *
         * @param offset 开始值
         * @param count  拉取范围
         * @return
         */
        List<WechatAuthorizerListVO> getAuthorizerList(Integer offset, Integer count);

        /**
         * 缓存ticket至redis
         *
         * @param encrypt
         */
      void saveTicketToRedis(String encrypt);

        /**
         * 获取某个素材的详细信息
         *
         * @param appId
         * @param mediaId
         * @return
         */
      String materialInfo(String appId,String mediaId);

        /**
         * 选中已授权公众号
         *
         * @param appIds
         * @return
         */
      void changeState(String appIds);

        /**
         * 展示已选中的公众号
         * @return
         */
        List<WechatAuthorizerListVO> getAuthorizerListByState();

}